﻿#include "onlineusers.h"

// 向在线用户列表中添加用户
void OnlineUsers::AddUsers(const std::string &name, StdSockPtr ptr)
{
    // 加锁，保证线程安全
    std::unique_lock<std::mutex> lock(mutex);

    // 将用户名和套接字指针存入用户列表
    users[name] = ptr;
}

// 从在线用户列表中移除指定用户
void OnlineUsers::RemoveUsers(StdSockPtr ptr)
{
    // 加锁，保证线程安全
    std::unique_lock<std::mutex> lock(mutex);
    // 遍历在线用户列表
    for (auto ite = users.begin(); ite != users.end(); ite++)
    {
        // 如果找到指定用户
        if (ite->second == ptr)
        {
            // 跳出循环
            break;
        }
        // 如果遍历到列表末尾
        if (ite != users.end())
        {
            // 从列表中移除该用户
            users.erase(ite);
        }
    }
}

// 在线用户类中的FindUser函数，用于查找指定名称的用户
StdSockPtr OnlineUsers::FindUser(const std::string &name)
{
    // 创建一个互斥锁，用于保护共享资源
    std::unique_lock<std::mutex> lock(mutex);
    // 在用户列表中查找指定名称的用户
    auto ite = users.find(name);
    // 如果找到了该用户，则返回该用户的指针
    if (ite != users.end())
    {
        return ite->second;
    }
    // 如果没有找到该用户，则返回空指针
    return nullptr;
}

// 获取在线用户链表
QStringList OnlineUsers::GetOnlineList()
{
    // 加锁，保证线程安全
    std::unique_lock<std::mutex> lock(mutex);

    QStringList result;
    // 遍历在线用户列表
    for(auto ite = users.begin(); ite != users.end(); ite++)
    {
        // 将转换后的用户名添加到QStringList类型的结果列表中
        result += QString::fromStdString(ite->first);
    }
    // 返回在线用户列表
    return result;
}
